/*
 * 项目消息类型字段信息定义
 */
#pragma once
#include <string>
#include <unordered_map>

namespace jsonrpc
{
// 请求字段宏定义
#define KEY_METHOD "method"
#define KEY_PARAMS "parameters"
#define KEY_TOPIC_KEY "topic_key"
#define KEY_TOPIC_MSG "topic_msg"
#define KEY_OPTYPE "optype"
#define KEY_HOST "host"
#define KEY_HOST_IP "ip"
#define KEY_HOST_PORT "port"
#define KEY_RCODE "rcode"
#define KEY_RESULT "result"

    // 消息类型定义 Message Type Definition
    enum class MType
    {
        REQ_RPC = 0, // 请求RPC
        RSP_RPC,     // 响应RPC
        REQ_TOPIC,   // 请求主题
        RSP_TOPIC,   // 响应主题
        REQ_SERVICE, // 请求服务
        RSP_SERVICE  // 响应服务
    };

    // 响应码类型定义 Response Code Definition
    enum class RCode
    {
        RCODE_OK = 0,            // 成功
        RCODE_PARSE_FAILED,      // 解析失败
        RCODE_ERROR_MSGTYPE,     // 错误消息类型
        RCODE_INVALID_MSG,       // 无效消息
        RCODE_DISCONNECTED,      // 断开连接
        RCODE_INVALID_PARAMS,    // 无效参数
        RCODE_NOT_FOUND_SERVICE, // 未找到服务
        RCODE_INVALID_OPTYPE,    // 无效操作类型
        RCODE_NOT_FOUND_TOPIC,   // 未找到主题
        RCODE_INTERNAL_ERROR     // 内部错误
    };

    // 响应码字符串映射 Response Code String Mapping
    static std::unordered_map<RCode, std::string> rcode_map = {
        {RCode::RCODE_OK, "OK"},
        {RCode::RCODE_PARSE_FAILED, "message parse failed"},
        {RCode::RCODE_ERROR_MSGTYPE, "error message type"},
        {RCode::RCODE_INVALID_MSG, "invalid message"},
        {RCode::RCODE_DISCONNECTED, "disconnected"},
        {RCode::RCODE_INVALID_PARAMS, "invalid parameters"},
        {RCode::RCODE_NOT_FOUND_SERVICE, "not found service"},
        {RCode::RCODE_INVALID_OPTYPE, "invalid optype"},
        {RCode::RCODE_NOT_FOUND_TOPIC, "not found topic"},
        {RCode::RCODE_INTERNAL_ERROR, "internal error"}};

    // 响应码描述 Response Code Description
    static std::string errReason(RCode rcode)
    {
        auto it = rcode_map.find(rcode);
        if (it != rcode_map.end())
        {
            return it->second;
        }
        return "unknown error";
    }

    // RPC请求类型定义 RPC Request Type Definition
    enum class RType
    {
        REQ_SYNC = 0, // 同步请求
        REQ_ASYNC,    // 异步请求
        REQ_CALLBACK  // 回调请求
    };

    // 主题操作类型定义 Topic Operation Type Definition
    enum class TopicOptype
    {
        TOPIC_CREATE = 0,
        TOPIC_REMOVE,
        TOPIC_SUBSCRIBE,
        TOPIC_CANCEL,
        TOPIC_PUBLISH
    };

    // 服务操作类型定义
    enum class ServiceOptype
    {
        SERVICE_REGISTRY = 0,
        SERVICE_DISCOVERY,
        SERVICE_ONLINE,
        SERVICE_OFFLINE,
        SERVICE_UNKNOWN
    };
}